"""
读写文件

读写文件的过程跟找到笔记本和打开笔记本类似
首先需要定位文件，打开第一页知道到达文末结束位置

参考文档：https://docs.python.org/zh-cn/3/tutorial/inputoutput.html#reading-and-writing-files
"""

def testOpenFiles():
    """
    打开文件
    open()返回file object, 最常用的参数有两个：open(filename, mode)

    第一个实参是文件名字符串，第二个实参是包含描述文件使用方法字符的字符串， mode的参数如下
    - "r" 只读文件
    - "w" 只写文件，同名文件会被覆盖
    - "a" 追加文件，任何写入的数据都会加到文件末尾
    - "r+" 读写文件，可读可写
    mode的实参是可选的，默认值为"r"

    通常，文件以textmode打开，就是说从文件中读取或者写入字符的时候都以指定方式进行编码。
    如果没有指定编码，那么默认编码方式跟平台相关，在mode中追加的"b"则以二进制方式读写文件

    在文件模式读写文件，默认会把特定平台的行结束符(Unix下为\n, windows下为\r\n)转为\n，在文本模式下写入数据的时候会把
    \n的转回平台特定结束符，这种方式需要对JPG或者exe等二进制文件特别注意

    在处理文件对象的时候，最好使用with关键字，优点在于文件会被正确地关闭，就算时触发了异常也可以，并且with比
    try-catch-finally代码块要简单的多

    """

    # 不使用with关键字，一定需要使用close
    file = open("./src/文件/文件读写/multipleLine.txt", 'w')
    file.write("first line\nsecond line\nthird line")

    # 不使用close函数，文件不会默认关闭
    print("file.closed is {}".format(file.closed))

    # 使用close函数
    file.close()
    print("file.closed is {}".format(file.closed))

    # 使用关键字with的语句
    with open("./src/文件/文件读写/multipleLine.txt", 'r') as file:
        read_data = file.read()
        print(read_data)
    
    # with会自己close文件
    print("file.closed is {}".format(file.closed))

    """
    如果没有使用with关键字，则应调用f.close()关闭文件，即可释放文件占用的系统资源;

    调用f.write()时，未使用with关键字，或未调用f.close()，即使程序正常退出，也可能导致f.write()的
    参数没有完全写入磁盘;

    通过with语句，或调用f.close()关闭文件对象后，再次使用该文件对象将会失败;
    """
testOpenFiles()